package JVM.第01篇_字节码篇;

/**
 * 常量池:存放所有常量
 * ●常量池是Class文件中内容最为丰富的区域之一。
 * 常量池对于Class文件中的字段和方法解析也有着至关重要的作用。
 * ●常量池:可以理解为Class文件之中的资源仓库，
 * 它是Class文件结构中与其他项目关联最多的数据类型(后面的很多数据类型都会指向此处)，
 * 也是占用Class文件空间最大的数据项目之一
 * ●常量池表项中，用于存放编译时期生成的各种字面量和符号引用，
 * 这部分内容将在类加载后进入方法区的运行时常量池中存放。
 *
 *
 * 2.1字面量和符号引用
 * 在对这些常量解读前，我们需要搞清楚几个概念。
 * 常量池主要存放两大类常量:
 *      字面量(Literal) 和 符号引用(Symbolic References)
 * 如下表:
 * 常量                具体的常量
 * 字面量               文本字符串
 *                   声明为final的常量值
 * 符号引用            类和接口的全限定名
 *                   字段的名称和描述符
 *                   方法的名称和描述符
 *
 * 谈谈你对 符号引用、直接引用 的理解?
 * Java代码在进行Javac编译的时候，并不像C和C++那样有“连接”这一步骤，
 * 而是在虚拟机加载Class文件的时候进行动态链接。
 * 也就是说，在Class文件中不会保存各个方法、字段的最终内存布局信息，
 * 因此这些字段、方法的符号引用不经过运行期转换的话无法得到真正的内存入口地址，
 * 也就无法直接被虚拟机使用。当虚拟机运行时，需要从常量池获得对应的符号引用，
 * 再在类创建时或运行时解析、翻译到具体的内存地址之中。
 *
 * 虚拟机在加载Class文件时才会进行动态链接，也就是说，Class文件中不会保存各个方法和字段的最终内存布局信息，
 * 因此，这些字段和方法的符号引用不经过转换是无法直接被虚拟机使用的。
 * 当虚拟机运行时，需要从常量池中获得对应的符号引用，
 * 再在类加载过程中的解析阶段将其替换为直接引用，并翻译到具体的内存地址中。
 *
 * 这里说明下符号引用和直接引用的区别与关联:
 *  ●符号引用:符号引用以一组符号来描述所引用的目标，符号可以是任何形式的字面量，
 *  只要使用时能无歧义地定位到目标即可。
 *  符号引用与虚拟机实现的内存布局无关，引用的目标并不一定已经加载到了内存中。
 *  ●直接引用:直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。
 *  直接引用是与虚拟机实现的内存布局相关的，同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。
 *  如果有了直接引用，那说明引用的目标必定已经存在于内存之中了。
 *
 */
public class C2_常量池 {
    public static void main(String[] args) {

    }
}
